package model.action.basic_function_action;

import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import model.action.basic_function_action.recaptcha.ReCaptchaImpl;
import model.action.basic_function_action.recaptcha.ReCaptchaResponse;
import model.dap.dao.ConsumerDAO;
import model.dap.dao.DealDAO;
import model.dap.dao.FavoriteDAO;
import model.dap.domain.Consumer;
import model.dap.domain.Deal;
import model.dap.mapper.ConsumerMapper;
import model.dap.mapper.DealMapper;
import model.dap.mapper.FavoriteMapper;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.opensymphony.xwork2.ModelDriven;
import common.base.BaseAction;
import common.util.ValidateUtil;

@Results({
		@Result(name = "success", type = "redirectAction", location = "home.html"),
		@Result(name = "loginLoad", location = "/view/basic_function_view/login.jsp"),
		@Result(name = "error", location = "/view/basic_function_view/login.jsp"),
		@Result(name = "orderForm", type = "redirectAction", location = "orderform.html"),
		@Result(name = "successCx", type = "redirectAction", location = "login.html"),
		@Result(name = "successEx", type = "redirectAction", location = "favorite-deal.html")})
@ParentPackage("master_tiles")
public class LoginAction extends BaseAction implements ModelDriven<Consumer> {

	private static final long serialVersionUID = 1L;
	protected static Logger log = Logger.getLogger(LoginAction.class);
	private Consumer consumer = new Consumer();
	private String message, idmessage;
	private int failCount;
	private String userID;
	private int sellpr;
	public int amountTemp1;
	//======================================================================================================

	public int getAmountTemp1() {
		return amountTemp1;
	}

	public void setAmountTemp1(int amountTemp1) {
		this.amountTemp1 = amountTemp1;
	}

	public int getSellpr() {
		return sellpr;
	}

	public void setSellpr(int sellpr) {
		this.sellpr = sellpr;
	}

	public int getFailCount() {
		return failCount;
	}

	public void setFailCount(int failCount) {
		this.failCount = failCount;
	}
	
	public String getUserID() {
		return userID;
	}

	public void setUserID(String userID) {
		this.userID = userID;
	}

	public String getIdmessage() {
		return idmessage;
	}

	public void setIdmessage(String idmessage) {
		this.idmessage = idmessage;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
		
	public LoginAction() {

	}
	//======================================================================================================
	// GET MODEL FOR CONSUMER
	@Override
	public Consumer getModel() {
		return consumer;
	}

	//======================================================================================================
	// LOAD LOGIN FORM
	@Action("/master/login")
	public String login() {
		return "loginLoad";
	}
	
	//======================================================================================================
	// VALIDATE INPUT FIELD
	/**
	 * validate input field,if error return false else return true
	 * 
	 * @param null
	 * @return true or false (boolean)
	 * 
	 */
	public boolean validateInputField() {
		boolean check = true;
		if (ValidateUtil.validateEmptyString(consumer.getUserID())==true) {
			showError(getText("Tên tài khoản không được để trống"));
			check = false;
		}
		
		if (ValidateUtil.validateEmptyString(consumer.getPassWord())==true) {
			showError(getText("Mật khẩu không được để trống"));
			check = false;
		}
		
		if (ValidateUtil.validateNameStandard(consumer.getUserID())==false) {
			showError(getText("Tên tài khoản không hợp lệ. Tên tài khoản phải nằm trong khoản [a-z]/[A-Z]/[0-9]"));
			check = false;
		}
		
		if (ValidateUtil.validateLengthOfUserID(consumer.getUserID())==false) {
			showError(getText("Tên tài khoản không hợp lệ- Chiều dài phải từ 6 đến 25 kí tự"));
			check = false;
		}
		
		if (ValidateUtil.validateLengthOfPassword(consumer.getPassWord())==false) {
			showError(getText("Chiều dài mật khẩu không hợp lệ - chiều dài phải từ 6-50"));
			check = false;
		}
		if (ValidateUtil.validateActiveConsumer(consumer.getUserID())==true) {
			showError(getText("Tài khoản người dùng chưa được kích hoạt-kiểm tra mail để kích hoạt tài khoản"));
			check = false;
		}
		check = Captcha();
		
		return check;
	}

	//======================================================================================================
	// SHOW CAPTCHA
	/**
	 * Show CAPTCHA
	 * 
	 * */
	private boolean Captcha() {

		HttpServletRequest request = ServletActionContext.getRequest();
		String remoteAddr = request.getRemoteAddr();
        ReCaptchaImpl reCaptcha = new ReCaptchaImpl();
        reCaptcha.setPrivateKey("6Lf4W98SAAAAAHfcJzLW6bf3oINtbE12J1jwIpXD");

        if(request.getParameter("recaptcha_challenge_field")==null){
        	return true;
        }
        String challenge = request.getParameter("recaptcha_challenge_field");
        String uresponse = request.getParameter("recaptcha_response_field");
        ReCaptchaResponse reCaptchaResponse = reCaptcha.checkAnswer(remoteAddr, challenge, uresponse);
        if (reCaptchaResponse.isValid()) {
        	showError(getText("đúng"));
        	return true;
        } else {
        	showError(getText("Mã captcha không đúng!!!!"));
        	return false;
        }
	}
	
	//======================================================================================================
	// LOGIN CONSUMER
	/**
	 * execute action login,check user exist?
	 * 
	 * @param null
	 * @return success or error (String)
	 * 
	 */
	@Action("/master/login_action")
	public String execute() {
		HttpSession session = ServletActionContext.getRequest().getSession();
		String type = ServletActionContext.getRequest().getMethod();
		
		if(type.toUpperCase() == "GET")
		{
			return "successCx";
		}

		try 
        { 
			consumer.setPassWord(ValidateUtil.MD5Encryption(consumer.getPassWord()));
        } 
     
        catch (NoSuchAlgorithmException a) 
        { 
            a.printStackTrace();
        } 
     
        catch (UnsupportedEncodingException a) 
        { 
           a.printStackTrace();
        }
		
		try {
			if (validateInputField()==false) {
				if(session.getAttribute("failCount")!=null){
					failCount = Integer.parseInt(session.getAttribute("failCount").toString());
				}
				failCount++;
				session.setAttribute("failCount", failCount);
				return ERROR;
			}
			FavoriteMapper favoriteMapper = new FavoriteDAO();
			int cons = favoriteMapper.countForFavorite(consumer.getUserID());

			ConsumerMapper consumerMapper = new ConsumerDAO();
			Consumer consumerResult = consumerMapper.login(consumer);
			//======================================================================================
			//======================================================================================
			// Login to orderForm if consumer is ordering deal
			if(getNextPage()!=null){
				setNextPage(null);
				loadParentDealCategory();
				getCityList2();
				// ===================== GET SESSION DEAL ID
				String str = session.getAttribute("sessionDealID").toString();
				sessionDealID = Integer.parseInt(str);
				int dealID = sessionDealID;
				
				DealMapper dealrmapper = new DealDAO();
				Deal deal1 = dealrmapper.getDealbyID((dealID));
				if(deal1 == null) {
					showError("Lỗi xảy ra trong quá trình đăng nhập để mua deal. Vui lòng thử lại");
					return ERROR;
				}
				
				sellpr = ((int) deal.getSellPrice());
				amountTemp1 = deal.getTotalAmount();
				
				consumer.setUserID(consumerResult.getUserID());
				consumer.setFullName(consumerResult.getFullName());
				setCurrentUser(consumerResult);
				session.setAttribute("failCount", null);
				loadParentDealCategory();
				getCityList2();
				
				return "orderForm";
			}
			else {
			// Login to homepage if don't have favorite deal
			if (cons <= 0) {
				if (consumerResult == null) {
					if(session.getAttribute("failCount")!=null){
						failCount = Integer.parseInt(session.getAttribute("failCount").toString());
					}
					failCount++;
					session.setAttribute("failCount", failCount);
					showError(getText("Tên tài khoản và mật khẩu không khớp.\n"+ 
									"(*) Tài khoản của bạn phải là tài khoản khách hàng và tồn tại trong hệ thống. \n"
									+ "Vui lòng nhập lại"));
					return ERROR;
				}
				consumer.setUserID(consumerResult.getUserID());
				consumer.setFullName(consumerResult.getFullName());
				setCurrentUser(consumerResult);
				session.setAttribute("failCount", null);
				loadParentDealCategory();
				getCityList2();
				return SUCCESS;
			}
			
			//======================================================================================
			// Login to favorite page if have favorite deal
			if (cons > 0) {
				if (consumerResult == null) {
					if (session.getAttribute("failCount") != null) {
						failCount = Integer.parseInt(session.getAttribute(
								"failCount").toString());
					}
					failCount++;
					session.setAttribute("failCount", failCount);
					showError(getText("Tên tài khoản và mật khẩu không khớp . Vui lòng nhập lại"));
					return ERROR;
				}

				consumer.setUserID(consumerResult.getUserID());
				consumer.setFullName(consumerResult.getFullName());
				setCurrentUser(consumerResult);
				session.setAttribute("failCount", null);
				loadParentDealCategory();
				getCityList2();
				return "successEx";
			}
			}
			return SUCCESS;
		} catch (Exception e) {
			log.error(e.getMessage());
			showError("Lỗi xảy ra trong quá trình đăng nhập. Vui lòng thử lại");
			return ERROR;
		}
	}

	

}
